package com.payment.common.utils;


import java.util.List;

import com.payment.common.base.RedisPool;

import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;

public class RedisPoolUtil {
	/**
	 * 键值对 存入
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static String set(String key, String value) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.set(key, value);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 键值对 存入
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static String set(byte[] key, byte[] value) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.set(key, value);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 指定key value失效时间
	 * 
	 * @param key
	 *            健
	 * @param value
	 *            值
	 * @param exTime
	 *            时间
	 * @return
	 */
	public static String setex(String key, String value, int exTime) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.setex(key, exTime, value);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}

		return result;

	}

	/**
	 * 指定key value失效时间
	 * 
	 * @param key
	 *            健
	 * @param value
	 *            值
	 * @param exTime
	 *            时间
	 * @return
	 */
	public static String setex(byte[] key, byte[] value, int exTime) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.setex(key, exTime, value);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 指定key失效时间
	 * 
	 * @param key
	 * @param exTime
	 * @return
	 */
	public static Long expire(String key, int exTime) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.expire(key, exTime);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 指定key失效时间
	 * 
	 * @param key
	 * @param exTime
	 * @return
	 */
	public static Long expire(byte[] key, int exTime) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.expire(key, exTime);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 根据key获取value
	 * 
	 * @param key
	 * @return
	 */
	public static String get(String key) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 根据key获取value
	 * 
	 * @param key
	 * @return
	 */
	public static byte[] get(byte[] key) {
		Jedis jedis = null;
		byte[] result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.get(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 删除指定key
	 * 
	 * @param key
	 * @return
	 */
	public static Long del(String key) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.del(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 删除指定key
	 * 
	 * @param key
	 * @return
	 */
	public static Long del(byte[] key) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.del(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 查询某些前缀的key
	 * 
	 * @param key
	 * @return
	 */
	public static ScanResult<String> scan(String key) {
		Jedis jedis = null;
		ScanResult<String> result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.scan(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 查询某些前缀的key
	 * 
	 * @param key
	 * @return
	 */
	public static ScanResult<byte[]> scan(byte[] key) {
		Jedis jedis = null;
		ScanResult<byte[]> result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.scan(key);
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 查询某些前缀的key数量
	 * 
	 * @param key
	 * @return
	 */
	public static Integer scanSize(String key) {
		Jedis jedis = null;
		Integer result = 0;
		try {
			jedis = RedisPool.getJedis();

			ScanResult<String> set = jedis.scan(key);
			if (set != null) {
				set.getResult().size();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 查询某些前缀的key数量
	 * 
	 * @param key
	 * @return
	 */
	public static Integer scanSize(byte[] key) {
		Jedis jedis = null;
		Integer result = 0;
		try {
			jedis = RedisPool.getJedis();

			ScanResult<byte[]> set = jedis.scan(key);
			if (set != null) {
				set.getResult().size();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			jedis.close();
		}
		return result;

	}

	/**
	 * 根据 list的 key 返回 list的 长度
	 *
	 * @param
	 * @param key
	 * @return
	 */
	public static Long length(String key) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.llen(key);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 在 list 指定位置 插入值 覆盖原有的值
	 *
	 * @param redisPool
	 * @param key
	 *            list的key
	 * @param index
	 *            指定位置
	 * @param value
	 * @return
	 */
	public static String set(String key, int index, String value) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.lset(key, index, value);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 在 list的 某个元素前或者后插入元素 如果key不存在，即为空列表，不进行任何操作 如果value不存在，不进行任何操作
	 *
	 * @param
	 * @param key
	 *            list的key
	 * @param position
	 *            前插还是后插
	 * @param pivot
	 *            list中相对位置的value
	 * @param value
	 *            插入的内容
	 * @return 更新后 list的长度 如果没有进行任何操作，返回-1
	 */
	public static long insert(String key, BinaryClient.LIST_POSITION position, String pivot, String value) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.linsert(key, position, pivot, value);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * List头部追加记录 将一个或多个值 value 插入到列表 key 的表头 如果list不存在，则创建list 并进行push 操作
	 *
	 * @param
	 * @param key
	 * @param value
	 * @return
	 */
	public static long lPush(String key, String... value) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.lpush(key, value);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * List尾部追加记录 将一个或多个值 value 插入到列表 key 的表尾(最右边) 如果list不存在，一个空列表会被创建并执行 RPUSH
	 * 操作
	 *
	 * @param
	 * @param key
	 * @param value
	 * @return
	 */
	public static long rPush(String key, String... value) {
		Jedis jedis = null;
		Long result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.rpush(key, value);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 获取list中 指定位置的值 index从0开始 如果 index 参数的值不在列表的区间范围内(out of range)，返回 nil
	 *
	 * @param
	 * @param key
	 * @param index
	 * @return
	 */
	public static String get(String key, int index) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.lindex(key, index);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 获取指定范围的记录 lrange 下标从0开始 -1表示最后一个元素
	 *
	 * @param
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public static List<String> lRange(String key, long start, long end) {
		List<String> result = null;
		Jedis jedis = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.lrange(key, start, end);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 移除并返回列表 key 的 第一个值 当 key 不存在时，返回 nil
	 *
	 * @param
	 * @param key
	 * @return
	 */
	public static String lPop(String key) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.lpop(key);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 移除并返回列表 key 的 最后一个值 当 key 不存在时，返回 nil
	 *
	 * @param
	 * @param key
	 * @return
	 */
	public static String rPop(String key) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.rpop(key);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}

	/**
	 * 清空List数据 ltrim 让列表只保留指定区间内的元素，不在指定区间之内的元素都将被删除 start和end为0时，即清空list
	 *
	 * @param
	 * @param key
	 * @return
	 */
	public static String clear(String key) {
		Jedis jedis = null;
		String result = null;
		try {
			jedis = RedisPool.getJedis();
			result = jedis.ltrim(key, 0, 0);
			result = jedis.lpop(key);
		} catch (Exception e) {
			// TODO: handle exception
			return result;
		} finally {
			jedis.close();
		}
		return result;
	}
	
	public static void main(String[] args) {
		System.out.println(RedisPoolUtil.get("aaa"));
	}
}
